Thread with C

more at SYSTEMPROGRAMMING_THREAD

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                   void *(*start_routine)(void *), void *arg);

첫번째 매개변수인 thread 는 쓰레드가 성공적으로 생성되었을때 생성된 쓰레드를 식별하기 위해서 사용되는 쓰레드 식별자이다. 

두번째 매개변수인 attr 은 쓰레드 특성을 지정하기 위해서 사용하며, 기본 쓰레드 특성을 이용하고자 할경우에 NULL 을 사용한다. 

세번째 매개변수인 start_routine는 분기시켜서 실행할 쓰레드 함수이며, 

네번째 매개변수인 arg는 위 start_routine 쓰레드 함수의 매개변수로 넘겨집니다.

성공적으로 생성될 경우 0을 리턴
C
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
//
void *t_function(void *data)
{
pid_t pid; // process id
pthread_t tid; // thread id
pid = getpid();
tid = pthread_self();
char* thread_name = (char*)data;
int i = 0;
while (i<3) // 0,1,2 loop .
{
//
// process id thread id
printf("[%s] pid:%u, tid:%x --- %d\n",
thread_name, (unsigned int)pid, (unsigned int)tid, i);
i++;
sleep(1); // 1
}
}
int main()
{
pthread_t p_thread[2];
int thr_id;
int status;
char p1[] = "thread_1"; // 1
char p2[] = "thread_2"; // 2
char pM[] = "thread_m"; //
sleep(1); // 2
// ① 1
// t_function
// t_function p1 .
thr_id = pthread_create(&p_thread[0], NULL, t_function, (void *)p1);
// pthread_create() 0
if (thr_id < 0)
{
perror("thread create error : ");
exit(0);
}
// ② 2
thr_id = pthread_create(&p_thread[1], NULL, t_function, (void *)p2);
if (thr_id < 0)
{
perror("thread create error : ");
exit(0);
}
// ③ main()
t_function((void *)pM);
// .
pthread_join(p_thread[0], (void **)&status);
pthread_join(p_thread[1], (void **)&status);
printf(" ?\n");
return 0;
}
Mutual exclusion
pthread_mutex_init()
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
//
pthread_mutex_t mutex_lock;
int g_count = 0; // .
void *t_function(void *data)
{
int i;
char* thread_name = (char*)data;
pthread_mutex_lock(&mutex_lock);
// critical section
g_count = 0; // 0 .
for (i = 0; i < 3; i++)
{
printf("%s COUNT %d\n", thread_name, g_count);
g_count++; //
sleep(1);
}
pthread_mutex_unlock(&mutex_lock);
}
int main()
{
pthread_t p_thread1, p_thread2;
int status;
// ,
pthread_mutex_init(&mutex_lock, NULL);
pthread_create(&p_thread1, NULL, t_function, (void *)"Thread1");
pthread_create(&p_thread2, NULL, t_function, (void *)"Thread2");
pthread_join(p_thread1, (void *)&status);
pthread_join(p_thread2, (void *)&status);
}